package com.priox.sigar.infraestructura.persistence.jpa.sigar;

import com.googlecode.ehcache.annotations.Cacheable;
import com.googlecode.genericdao.search.Search;
import com.mm.support.jpa.BaseDAO;
import com.priox.sigar.client.dto.AgrupacionDTO;
import com.priox.sigar.domain.model.Agrupacion;
import com.priox.sigar.domain.model.AgrupacionRepository;
import com.priox.sigar.server.infrastructure.persistence.util.WhereParams;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


/**
 * User: aglwkrs
 * Date: 30/11/11
 */
@Repository
public class AgrupacionRepositoryImpl extends BaseDAO<Agrupacion, Long> implements AgrupacionRepository {

    private final static Logger logger = LoggerFactory.getLogger(AgrupacionRepositoryImpl.class);

    private NamedParameterJdbcTemplate jdbcTemplate;


    @Autowired
    DataSource dataSource;

    @PostConstruct
    public void init() {
        this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    public List<Agrupacion> findByIds(List<Long> ids) {
        if (ids.isEmpty()) return new ArrayList<Agrupacion>();
        Search s = new Search();
        s.addFilterIn("id", ids);
        return search(s);
    }

    public List<Agrupacion> findByNameList(String name) {
        Search s = new Search();
        if (StringUtils.isNotBlank(name)) {
            s.addFilterILike("nombre", name.toUpperCase() + "%");
        }
        s.addSortAsc("nombre");
        return search(s);


    }

    public Agrupacion findByName(String name) {
        Search s = new Search();
        s.addFilterEqual("nombre", name.toUpperCase());
        return searchUnique(s);
    }

    @Cacheable(cacheName = "agrupacionByPrefijo")
    public Agrupacion findByPrefijo(String name) {
        logger.debug("Buscando findByPrefijo por " + name);
        Search s = new Search();
        if (StringUtils.isNotBlank(name)) {
            s.addFilterILike("cuentaPrefijo", "%" + name.toUpperCase() + "%");
        }
        List result = search(s);

        if (result.isEmpty()) {
            Agrupacion agrupacion = new Agrupacion();
            agrupacion.setAgrupacionId(9l);
            agrupacion.setNombre("Sin Agrupacion");
            return agrupacion;
        }

        return (Agrupacion) result.get(0);
    }

       public void saveCadena(Agrupacion cadena) {
        this.persist(cadena);
    }

    public Agrupacion findBy(Long code) {
        Search s = new Search();
        if (code != null) {
            s.addFilterEqual("id", code);
        }
        return searchUnique(s);
    }

    public List<Agrupacion> findByRUC(String ruc) {
        Search s = new Search();
        if (ruc != null) {
            s.addFilterEqual("ruc", ruc);
        }

        return search(s);
    }


}
